-- TaskM
-- Create by chengb Feb/7/2015
-- 管理任务

module("TaskM", package.seeall);

-- 所有的规则处理子模块
local rules = {};

-- 任务配置表
local taskTable = {};

-- 根据子规则存放配置
local taskByRule = {};

-- 根据区域存放配置
local taskByArea = {};

-- 根据类型存放配置
local taskByType = {};

-- 载入配置表
local _init = false;
local loadCsv = function()
    if _init then return end
    _init = true;

    rules = {};
    taskTable = {};
    taskByRule = {};
    taskByArea = {};
    taskByType = {};

    -- 转换下task信息表
    local task_CSV = get_task_CSV();
    for i = 1, #task_CSV do
        taskTable[task_CSV[i].id] = task_CSV[i];

        -- 根据子规则存放配置
        local rule = task_CSV[i].rule; 
        if type(rule) == 'string' then
            taskByRule[rule] = taskByRule[rule] or {};
            table.insert(taskByRule[rule], task_CSV[i]);
        end

        -- 根据区域存放配置
        local area = task_CSV[i].area; 
        if type(area) == 'number' then
            taskByArea[area] = taskByArea[area] or {};
            table.insert(taskByArea[area], task_CSV[i]);
        end

        -- 根据类型存放配置
        local taskType = task_CSV[i].type; 
        if type(taskType) == 'number' then
            taskByType[taskType] = taskByType[taskType] or {};
            table.insert(taskByType[taskType], task_CSV[i]);
        end
    end
    task_CSV = {};
end

-- 模块初始化
function init()
    if not _init then
        loadCsv();

        -- 载入所有的规则处理子模块
        rules = LOAD_PATH("game/logic/module/task");
    end    
end

-- 检索任务信息
function query(taskId, path)
    local m = taskTable[taskId];

    if not m or path == "" or not path then
        return m;
    end

    return m[path];
end

-- 根据子规则获取任务
function getTasksByRule(rule)
    return taskByRule[rule];
end

-- 根据区域获取任务
function getTasksByArea(area)
    return taskByArea[area];
end

-- 根据类型获取任务
function getTasksByType(type)
    return taskByType[type];
end

-- 获取玩家任务信息
function getUserTaskInfo(taskId)
    return ME.user.tasks[taskId];
end

-- 获取任务日志
function getTaskLog(taskId)
    local rule = query(taskId, "rule");
    if not rule then
        return "";
    end

    local f = rules[rule];
    return f.getTaskLog(taskId);
end

-- 获取任务描述
function getTaskDesc(taskId)
    local rule = query(taskId, "rule");
    if not rule then
        return "";
    end

    local f = rules[rule];
    return f.getTaskDesc(taskId);
end

-- 更新任务数据（由服务器通知）
function updateTask(taskId, info)
    ME.user.tasks[taskId] = info;
end

-- 新领取一个任务
function assignTask(taskId, info)
-- TODO
end

-- 删除一个任务
function clearTask(taskId)
    -- 本来就没有此任务
    if not ME.user.tasks[taskId] then
        return;
    end

    ME.user.tasks[taskId] = nil;

    -- 删除任务任务
    EventMgr.fire(event.REMOVE_TASK, taskId);
end

-- 判断某个任务是否是默认领取的
function isDefaultAssign(taskId)
    local taskInfo = query(taskId);
    if not taskInfo then
        return false;
    end

    if taskInfo["default_assign"] == 1 then
        return true;
    end

    return false;
end

-- 获取任务进度
function getProgress(taskId)
    local info = getUserTaskInfo(taskId);

    -- 玩家的任务列表中没有此任务
    if not info then
        -- 如果是默认领取的任务，默认返回0
        if isDefaultAssign(taskId) then
            return 0;
        end
    end

    return info["progress"];
end

-- 更新任务进度
function setProgress(taskId, progress)
    -- 进度必须是整数
    assert(type(progress) == "number");

    local tasks = ME.user.tasks;
    local info = tasks[taskId];

    -- 没有该任务数据
    if not info then
        -- 如果不是是默认领取的任务，不处理
        if not isDefaultAssign(taskId) then
            return false;
        end

        info = {};
    end

    -- 修改此任务进度
    info.progress = progress;
    tasks[taskId] = info;
    ME.user:setTasks(tasks);

    -- 尝试完成任务
    finishTask(taskId);
end

-- 是否完成了任务
function isFinished(taskId)
    local info = getUserTaskInfo(taskId);

    -- 没有任务数据
    if not info then
        return false
    end

    -- 进度达到要求了
    local require = query(taskId, "require");
    return info.progress >= require;
end

-- 尝试完成任务
function finishTask(taskId)
    -- 经判断无法完成
    if true ~= isFinished(taskId) then
        return false;
    end

    local taskInfo = query(taskId);
    if 1 == taskInfo["auto_bonus"] then
    -- TODO 自动领取奖励
    end

    -- 抛出完成任务事件
    -- TODO

    return true;
end

-- 领取任务奖励
function takeBonus(taskId)
    -- TODO    
    return true
end
